package ar.com.jsejtman.common.security.credential.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import net.iharder.Base64;

/**
 * Clase utilitaria con métodos para aplicar a las claves de seguridad.
 * 
 * @author jsejtman
 */
public final class PasswordUtils {

	/**
	 * Alfabeto de posibles valores de una clave de seguridad.
	 */
	private static final char[] LETTERS = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
	        'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

	/**
	 * Números de posibles valores de una clave de seguridad.
	 */
	private static final char[] NUMBERS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

	/**
	 * Tamaño de clave de seguridad generada.
	 */
	private static final int RANDOM_PASSWORD_LENGTH = 8;

	/**
	 * Constructor privado para evitar instanciar clase utilitaria.
	 */
	private PasswordUtils() {

	}

	/**
	 * Encripta una clave.
	 * 
	 * @param plainPassword Clave sin encriptar.
	 * @return Clave encriptada.
	 */
	public static String encryptPassword(final String plainPassword) {

		MessageDigest md = null;

		try {
			md = MessageDigest.getInstance("SHA");
		} catch (final NoSuchAlgorithmException e) {
			throw new RuntimeException(e.getMessage());
		}

		try {
			md.update(plainPassword.getBytes("UTF-8"));
		} catch (final UnsupportedEncodingException e) {
			throw new RuntimeException(e.getMessage());
		}

		return (Base64.encodeBytes(md.digest()));
	}

	/**
	 * Genera una clave al azar (sin encriptar).
	 * 
	 * @return Clave al azar generada (sin encriptar).
	 */
	public static String generateRandomPassword() {

		final Random randomGenerator = new Random();

		final StringBuffer generatedPassword = new StringBuffer();

		for (int i = 0; i < PasswordUtils.RANDOM_PASSWORD_LENGTH; i++) {

			final boolean generateLetter = randomGenerator.nextBoolean();

			if (generateLetter) {
				generatedPassword.append(PasswordUtils.LETTERS[randomGenerator
				        .nextInt(PasswordUtils.LETTERS.length)]);
			} else {
				generatedPassword.append(PasswordUtils.NUMBERS[randomGenerator
				        .nextInt(PasswordUtils.NUMBERS.length)]);
			}

		}

		return (generatedPassword.toString());
	}
}
